﻿@inherits SusuCMS.Web.Front.WidgetPageBase
@{
    FrontHtml.ClientScript.jQuery(true);
}
<h2>
    @WidgetLabel("Base64 Encode / Decode")</h2>
<div class="description">
    @WidgetLabel("Encode or decode the code by base64 way.")
</div>
<textarea id="text"></textarea><p class="buttons">
    <button id="decode" type="button">
        @WidgetLabel("Decode")</button>
    <button id="encode" type="button">
        @WidgetLabel("Encode")</button></p>
<script type="text/javascript">
    $(function(){
        var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

        var base64DecodeChars = new Array(
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
            -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
            41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

        function base64encode(str) {
            var out, i, len;
            var c1, c2, c3;
            len = str.length;
            i = 0;
            out = "";

            while (i &amp;lt; len) {
                c1 = str.charCodeAt(i++) &amp;amp; 0xff;
                if (i == len) {
                    out += base64EncodeChars.charAt(c1 &amp;gt;&amp;gt; 2);
                    out += base64EncodeChars.charAt((c1 &amp;amp; 0x3) &amp;lt;&amp;lt; 4);
                    out += "==";
                    break;
                }

                c2 = str.charCodeAt(i++);

                if (i == len) {
                    out += base64EncodeChars.charAt(c1 &amp;gt;&amp;gt; 2);
                    out += base64EncodeChars.charAt(((c1 &amp;amp; 0x3) &amp;lt;&amp;lt; 4) | ((c2 &amp;amp; 0xF0) &amp;gt;&amp;gt; 4));
                    out += base64EncodeChars.charAt((c2 &amp;amp; 0xF) &amp;lt;&amp;lt; 2);
                    out += "=";
                    break;
                }

                c3 = str.charCodeAt(i++);
                out += base64EncodeChars.charAt(c1 &amp;gt;&amp;gt; 2);
                out += base64EncodeChars.charAt(((c1 &amp;amp; 0x3) &amp;lt;&amp;lt; 4) | ((c2 &amp;amp; 0xF0) &amp;gt;&amp;gt; 4));
                out += base64EncodeChars.charAt(((c2 &amp;amp; 0xF) &amp;lt;&amp;lt; 2) | ((c3 &amp;amp; 0xC0) &amp;gt;&amp;gt; 6));
                out += base64EncodeChars.charAt(c3 &amp;amp; 0x3F);
            }

            return out;
        }

        function base64decode(str) {
            var c1, c2, c3, c4;
            var i, len, out;
            len = str.length;
            i = 0;
            out = "";

            while (i &amp;lt; len) {
                /* c1 */
                do {
                    c1 = base64DecodeChars[str.charCodeAt(i++) &amp;amp; 0xff];
                } while (i &amp;lt; len &amp;amp;&amp;amp; c1 == -1);

                if (c1 == -1)
                    break;
                /* c2 */

                do {
                    c2 = base64DecodeChars[str.charCodeAt(i++) &amp;amp; 0xff];
                } while (i &amp;lt; len &amp;amp;&amp;amp; c2 == -1);

                if (c2 == -1)
                    break;

                out += String.fromCharCode((c1 &amp;lt;&amp;lt; 2) | ((c2 &amp;amp; 0x30) &amp;gt;&amp;gt; 4));
            
                /* c3 */
                do {
                    c3 = str.charCodeAt(i++) &amp;amp; 0xff;
                    if (c3 == 61)
                        return out;
                    c3 = base64DecodeChars[c3];
                } while (i &amp;lt; len &amp;amp;&amp;amp; c3 == -1);
                if (c3 == -1)
                    break;

                out += String.fromCharCode(((c2 &amp;amp; 0XF) &amp;lt;&amp;lt; 4) | ((c3 &amp;amp; 0x3C) &amp;gt;&amp;gt; 2));

                /* c4 */
                do {
                    c4 = str.charCodeAt(i++) &amp;amp; 0xff;
                    if (c4 == 61)
                        return out;

                    c4 = base64DecodeChars[c4];
                } while (i &amp;lt; len &amp;amp;&amp;amp; c4 == -1);

                if (c4 == -1)
                    break;

                out += String.fromCharCode(((c3 &amp;amp; 0x03) &amp;lt;&amp;lt; 6) | c4);
            }

            return out;
        }

        function utf16to8(str) {
            var out, i, len, c;
            out = "";
            len = str.length;

            for (i = 0; i &amp;lt; len; i++) {
                c = str.charCodeAt(i);
                if ((c &amp;gt;= 0x0001) &amp;amp;&amp;amp; (c &amp;lt;= 0x007F)) {
                    out += str.charAt(i);
                } else if (c &amp;gt; 0x07FF) {
                    out += String.fromCharCode(0xE0 | ((c &amp;gt;&amp;gt; 12) &amp;amp; 0x0F));
                    out += String.fromCharCode(0x80 | ((c &amp;gt;&amp;gt; 6) &amp;amp; 0x3F));
                    out += String.fromCharCode(0x80 | ((c &amp;gt;&amp;gt; 0) &amp;amp; 0x3F));
                } else {
                    out += String.fromCharCode(0xC0 | ((c &amp;gt;&amp;gt; 6) &amp;amp; 0x1F));
                    out += String.fromCharCode(0x80 | ((c &amp;gt;&amp;gt; 0) &amp;amp; 0x3F));
                }
            }

            return out;
        }

        function utf8to16(str) {
            var out, i, len, c;
            var char2, char3;
            out = "";
            len = str.length;
            i = 0;

            while (i &amp;lt; len) {
                c = str.charCodeAt(i++);
                switch (c &amp;gt;&amp;gt; 4) {
                    case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                        // 0xxxxxxx
                        out += str.charAt(i - 1);
                        break;
                    case 12: case 13:
                        // 110x xxxx   10xx xxxx
                        char2 = str.charCodeAt(i++);
                        out += String.fromCharCode(((c &amp;amp; 0x1F) &amp;lt;&amp;lt; 6) | (char2 &amp;amp; 0x3F));
                        break;
                    case 14:
                        // 1110 xxxx  10xx xxxx  10xx xxxx
                        char2 = str.charCodeAt(i++);
                        char3 = str.charCodeAt(i++);
                        out += String.fromCharCode(((c &amp;amp; 0x0F) &amp;lt;&amp;lt; 12) |
                           ((char2 &amp;amp; 0x3F) &amp;lt;&amp;lt; 6) |
                           ((char3 &amp;amp; 0x3F) &amp;lt;&amp;lt; 0));
                        break;
                }
            }

            return out;
        }

        $('#encode').click(function () {
            var unencoded = $('#text').val();
            $('#text').val(base64encode(utf16to8(unencoded)));
        });

        $('#decode').click(function () {
            var encoded = $('#text').val();
            $('#text').val(utf8to16(base64decode(encoded)));
        });
    });
</script>
